package basic

import (
	"fmt"
	"math/cmplx"
	"math"
)

//在函数里面定义的变量作用域只在函数里面
var aa = 22
var bb = "44"
//cc := 33
//在函数外面必须带关键字var    不能使用简略写法
//go 没有全局变量的概念，只有包，定义的变量值局限于包内
var (
	cc = "cc"
	dd = true
)

func varibleZeroValue()  { //定义空值
	var a int
	var b string
	fmt.Printf("%d %q", a, b)
}

func varibleInitialValue()  { //定义赋值
	var a, b int = 3, 4
	var c string = "abc"
	fmt.Println(a, b, c)
}

func varibleTypeDeduction()  { //推断出定义的类型
	var a, b, c, d = 1, 2, true, "aaa"
	fmt.Println(a, b, c, d)
}

func varibleShorter()  { //简略写法   函数里一般使用此方法
	a, b, c, d := 1, 2, true, "aaa"
	b = 44
	fmt.Println(a, b, c, d)
}

func euler()  { //欧拉公式
	c := 3 + 4i
	d := cmplx.Pow(math.E, 1i * math.Pi) + 1
	e := cmplx.Exp(1i * math.Pi) + 1    //d=e
	fmt.Println(cmplx.Abs(c), d, e)
}

func triange()  { //强制类型转换
	var a, b int = 3, 4
	var c int
	c = int(math.Sqrt(float64(a * a + b * b)))
	fmt.Println(c)
}

func consts() {
	const filename = "glxe.in"
	const a, b = 3, 4 //常量可以指定类型，也可以不指定类型，其中不指定类型的常量也可以是int， 也可以是float
	var c int
	//c = int(math.Sqrt(a * a + b * b)) // 转换或者不转换都可以的
	c = int(math.Sqrt(float64(a * a + b * b)))
	
	
	fmt.Println(filename, c)
}

func enums() {
	
	const (
		cpp = iota //枚举值
		_
		python
		golang
		javascript
	)
	
	const (
		b = 1 << (10 * iota)
		kb
		mb
		gb
		tb
		pb
	)
	
	fmt.Println(cpp, python, golang, javascript)
	fmt.Println(b, kb, mb, gb, tb, pb)
}

func main()  {
	varibleZeroValue()
	varibleInitialValue()
	varibleTypeDeduction()
	varibleShorter()
	fmt.Println(aa, bb, cc, dd)
	
	
	euler()
	triange()
	consts()
	enums()
}
